package com.fll.fangyiuser.controller;

import com.aliyun.oss.ServiceException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fll.fangyicommon.entity.user.Friend;
import com.fll.fangyicommon.entity.user.Oss;
import com.fll.fangyicommon.entity.ResultOk;
import com.fll.fangyicommon.entity.user.User;
import com.fll.fangyicommon.utils.OssUtil;
import com.fll.fangyiuser.exception.GlobleException;
import com.fll.fangyiuser.service.FriendService;
import com.fll.fangyiuser.service.OssService;
import com.fll.fangyiuser.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @author fll
 * create 2023/2/25
 */
@RestController
@Slf4j
@RequestMapping("/user")
public class UserController {

    /**
     * 1 @RequestParam
     * 表单参数，键值对参数
     * 可以接收get或者post请求提交的参数
     * 示例：name1=value1&name2=value2&name3=value3
     * 2 @PathVariable
     * 请求路径参数
     * 示例：http:localhost:8080/123，http:localhost:8080/123/aa/bb
     * 3 @RequestBody
     * Post请求协议体中的数据
     * 完整的接收协议体中的Json 数据
     */
    @Autowired
    private OssService ossService;

    @Autowired
    private UserService userService;

//    @Autowired
//    private FriendService friendService;


    //更新背景图
    @PostMapping("/uploadBgImg")
    public ResultOk uploadBgImg(@RequestParam("file") MultipartFile file, @RequestHeader String userInfo) {

        ResultOk ok = new ResultOk<Oss>();
        User user = null;
        try {
            //将请求头中的user信息系列化成user对象
            user = new ObjectMapper().readValue(userInfo, User.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            String fileName = OssUtil.genName(file.getOriginalFilename(), user.getUserId());
            String oSSfileUrl = OssUtil.upload(file.getBytes(), fileName);

            Oss oss = ossService.selectOssByUserId(user.getUserId());
            ossService.updateByUserId(user.getUserId(), oSSfileUrl);
            ok.setData(oss);
        } catch (Exception e) {
            e.printStackTrace();
            ok.setCode(503);
            ok.setMsg("更新失败！");
            return ok;
        }
        ok.setCode(200);
        ok.setMsg("更新成功！");
        return ok;
    }

    //更新头像
    @PostMapping("/uploadAvatar")
    public ResultOk uploadAvatar(@RequestParam("file") MultipartFile file, @RequestHeader String userInfo) {

        ResultOk ok = new ResultOk<Oss>();
        User user = null;
        try {
            //将请求头中的user信息系列化成user对象
            user = new ObjectMapper().readValue(userInfo, User.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            String fileName = OssUtil.genName(file.getOriginalFilename(), user.getUserId());
            String oSSfileUrl = OssUtil.upload(file.getBytes(), fileName);

            Integer num = ossService.updateAvatarByUserId(user.getUserId(), oSSfileUrl);
            if (num != 0) {
                ok.setCode(200);
                ok.setMsg("头像更新成功！");
                return ok;
            }
        } catch (Exception e) {
            e.printStackTrace();
            ok.setCode(503);
            ok.setMsg("头像更新失败！");
            return ok;
        }
        ok.setCode(503);
        ok.setMsg("其他错误！");
        return ok;
    }

    //修改用户信息
    @PostMapping("/editUserInfo")
    public ResultOk editUserInfo(@RequestBody User user, @RequestHeader String userInfo) {

        ResultOk<User> ok = new ResultOk<>();
        User newUser = null;
        try {
            newUser = new ObjectMapper().readValue(userInfo, User.class);

            newUser.setNickName(user.getNickName());
            newUser.setAge(user.getAge());
            newUser.setSex(user.getSex());
            newUser.setUserDescribe(user.getUserDescribe());
            newUser.setEmail(user.getEmail());
            newUser.setUserPass(user.getUserPass());

            Integer num = userService.update(newUser);
            log.info("num===>", num);
            if (num != 0) {
                ok.setCode(200);
                ok.setMsg("修改成功！");
                return ok;
            }
        } catch (Exception e) {
            e.printStackTrace();
            ok.setCode(400);
            ok.setMsg("修改失败");
            return ok;
        }
        ok.setCode(400);
        ok.setMsg("未知错误！");
        return ok;

    }

    //登录过后根据token再次获取用户信息(用户刷新缓存)
    @GetMapping("/getUserInfo")
    public ResultOk getUserInfo(@RequestHeader String userInfo) {
        ResultOk<User> ok = new ResultOk<>();
        User user = null;
        try {
            //将请求头中的user信息系列化成user对象
            user = new ObjectMapper().readValue(userInfo, User.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        User newUser = userService.getUserInfoByUserId(user.getUserId());
        Oss newOss = ossService.selectOssByUserId(user.getUserId());
        if (newUser != null && newOss != null) {
            newUser.setOss(newOss);
            ok.setCode(200);
            ok.setMsg("刷新成功");
            ok.setData(newUser);
            return ok;
        }
        if (newUser == null || newOss == null) {
            newUser.setOss(newOss);
            ok.setCode(400);
            ok.setMsg("请稍后再试");
            ok.setData(newUser);
            return ok;
        }
        ok.setCode(400);
        ok.setMsg("刷新失败");
        return ok;
    }

    //添加好友
//    @GetMapping("/addFriend")
//    public ResultOk addFriend(@Param("friendId") Integer friendId, @RequestHeader String userInfo) {
//
//        ResultOk ok = new ResultOk();
//
//        if (friendId == null) {
//            ok.setCode(400);
//            ok.setMsg("用户id不能为空！");
//            return ok;
//        }
//        if (userService.getUserInfoByUserId(friendId) == null) {
//            ok.setCode(400);
//            ok.setMsg("用户不存在!");
//            return ok;
//        }
//        User user = null;
//        ;
//        try {
//            user = new ObjectMapper().readValue(userInfo, User.class);
//            if (friendId.equals(user.getUserId())) {
//                ok.setCode(400);
//                ok.setMsg("不能添加自己为好友！");
//                return ok;
//            }
//            //通过两个用户id验证是否为朋友
//            Friend isFriend = friendService.verifyFriend(user.getUserId(), friendId);
//            if (isFriend != null) {
//                if (isFriend.getState() == 1) {
//                    ok.setCode(400);
//                    ok.setMsg("你们已经是好友啦！");
//                    return ok;
//                }//按理说应该走这里的if，但是你看效果.没走这里
//                if (isFriend.getState() == 0) {
//                    ok.setCode(400);
//                    ok.setMsg("你已发送过请求了！");
//                    return ok;
//                }
//            }
//            /**
//             * 此处之前踩过一次坑，添加好友时只在friend关系表新增一条记录，而同意的时候除了把已添加的一条state设置为1，还要新增另外一条记录也把state设置为1
//             */
//            //否则添加进friend表（代表发送了好友添加请求）
//            Friend friend = new Friend();
//            //user_id为本用户，friend_id为对方
//            friend.setUserId(user.getUserId());
//            friend.setFriendId(friendId);
//            friend.setState(0);
//            Integer num1 = friendService.insert(friend);
//
//            if (num1 != null || num1 != 0) {
//                ok.setCode(200);
//                ok.setMsg("发送请求成功!");
//                return ok;
//            }
//
//        } catch (Exception e) {
//            e.printStackTrace();
//            ok.setCode(503);
//            ok.setMsg("后端异常！");
//            return ok;
//        }
//        ok.setCode(400);
//        ok.setMsg("未知错误！");
//        return ok;
//    }
//
//    //根据state查询好友列表
//    @GetMapping("/getFriend")
//    public ResultOk getFriend(@RequestParam("state") Integer state, @RequestHeader String userInfo) {
//
//        ResultOk<List> ok = new ResultOk();
//
//        User user = null;
//        try {
//            user = new ObjectMapper().readValue(userInfo, User.class);
//            //由于添加好友在friend表中加入的是两条记录，user_id就为当前用户id，friend_id为好友id
//            List<Friend> friendList = friendService.getFriendByUserId(user.getUserId(), state);
//            if (state == 0 && friendList == null) {
//                ok.setCode(400);
//                ok.setMsg("暂无好友申请!");
//                return ok;
//            }
//            if (state == 1 && friendList == null) {
//                ok.setCode(400);
//                ok.setMsg("暂无好友!");
//                return ok;
//            }
//            ok.setCode(200);
//            ok.setMsg("查询成功！");
//            ok.setData(friendList);
//            return ok;
//        } catch (Exception e) {
//            e.printStackTrace();
//            ok.setCode(503);
//            ok.setMsg("后端异常！");
//        }
//        return ok;
//    }

    //同意好友申请
//    @PostMapping("/agreeFriend")
//    @Transactional(rollbackFor = Exception.class)
//    public ResultOk agreeFriend(@RequestBody Map<String, Object> params, @RequestHeader String userInfo) throws JsonProcessingException {
//
//        Integer friendId = (Integer) params.get("friendId");
//        ResultOk<User> ok = new ResultOk<>();
//        User user = new ObjectMapper().readValue(userInfo, User.class);
//        /**
//         * 此处之前踩过一次坑，添加好友成功后应该在friend表新增两条记录，而不是一条，这样也符合qq的逻辑，存在单向好友
//         * 即之前未同意的那条记录state设置为1，重新把friend_id和user_id对换再加入一条
//         * 如果只新增一条记录，根据用户id获取用户好友列表也会复杂化（即friend表中user_id和friend_id都可能是好友的id），添加两条记录完美避开
//         * 同时要保证添加两条记录要么同时成功要么同时失败
//         */
//        Integer num1 = friendService.agreeFriend(user.getUserId(), friendId);
//        if (num1 == 0) {
////            throw new GlobleException("dsd");
//            throw new IllegalArgumentException("数据库更新结果为0");
//        }
//
//        Friend friend = new Friend();
//        friend.setUserId(user.getUserId());
//        friend.setFriendId(friendId);
//        friend.setState(1);
//        Integer num2 = friendService.insert(friend);
//        if (num1 != 0 && num2 != 0) {
//            ok.setCode(200);
//            ok.setMsg("同意成功！");
//            return ok;
//        }
//
//        ok.setCode(400);
//        ok.setMsg("未知错误！");
//        return ok;
//    }

    //删除好友
//    @PostMapping("/deleteFriend")
//    @Transactional(rollbackFor = Exception.class)
//    public ResultOk deleteFriend(@RequestBody Map<String, Object> params, @RequestHeader String userInfo) throws JsonProcessingException {
//
//        ResultOk<User> ok = new ResultOk<>();
//        Integer friendId = (Integer) params.get("friendId");
//        if (friendId == null){
//            ok.setCode(400);
//            ok.setMsg("好友id不能为空");
//            return ok;
//        }
//
//        User user = new ObjectMapper().readValue(userInfo, User.class);
//        Integer num1 = friendService.deleteFriend(user.getUserId(), friendId);
//        Integer num2 = friendService.deleteFriend(friendId, user.getUserId());
//        if (num1 == 0 || num2 == 0){
//            throw new ServiceException("删除好友需把friend表里两条记录删除！");
//        }
//        if (num1 != 0 && num2 != 0){
//            ok.setCode(200);
//            ok.setMsg("删除成功！");
//            return ok;
//        }
//        ok.setCode(400);
//        ok.setMsg("未知错误！");
//        return ok;
//    }

    /**
     * openFeign远程调用，根据userId查询出share所属的user信息
     * @param userId
     * @return
     */
    @GetMapping("/getUserInfoByRpc")
    public User getUserInfoByRpc(@RequestParam Integer userId) {
        User newUser = userService.getUserInfoByUserId(userId);
        Oss newOss = ossService.selectOssByUserId(userId);
        if (newUser != null && newOss != null) {
            newUser.setOss(newOss);
            return newUser;
        }else if (newUser != null || newOss != null) {
            newUser.setOss(newOss);
            return null;
        }else {
            return null;
        }
    }

    /**
     * openFeign远程调用，查询出好友的user_id
     * @param userId
     * @return
     */
//    @GetMapping("/getFriendByRpc")
//    public String getFriendByRpc(@RequestParam Integer userId) {
//       return friendService.getFriendByRpc(userId);
//    }

}
